/* Copyright (C) 2017-2099 All right reserved
 * For free
 *
 * @file md5.h
 * @brief
 * @author qigaohua, qigaohua168@163.com
 * @version 0.0.1
 * @date 2020-10-29
 */
#ifndef __MD5_H_
#define __MD5_H_

#ifdef __cplusplus
extern "C" {
#endif

#define MD5_OUTPUT_DIGEST   16   // 16字节摘要(digest)
#define MD5_PRINT_CHARS     32   // 十六进制打印32个字符

// #define OPENSSL

#ifndef OPENSSL
typedef struct
{
    unsigned int count[2];
    unsigned int state[4];
    unsigned char buffer[64];
} MD5_CTX;

void MD5_Init(MD5_CTX *context);
void MD5_Update(MD5_CTX *context, const unsigned char *input,unsigned int inputlen);
void MD5_Final(unsigned char digest[16], MD5_CTX *context);
#endif


/**
 * @brief md5_p   将得到的MD5值以十六进制输出
 *
 * @param in      MD5值
 * @param out     十六进制输出的32个字符
 * @param outsize out大小，不得小于32
 *
 * @return        0: 成功   <0: 失败
 */
int md5_p(const unsigned char *in, char *out, int outsize);


/**
 * @brief md5_s   计算给出字符串的MD5值
 *
 * @param str     字符串
 * @param slen    字符串长度，不包括'\0'
 * @param out     保存MD5值的指针
 * @param outsize out的大小, 不得小于16
 *
 * @return        0: 成功   <0: 失败
 */
int md5_s(const char *str, int slen, unsigned char *out, int outsize);


/**
 * @brief md5_f   计算给出文件的MD5值
 *
 * @param str     文件名称
 * @param out     保存MD5值的指针
 * @param outsize out的大小, 不得小于16
 *
 * @return        0: 成功   <0: 失败
 */
int md5_f(const char *file, unsigned char *out, int outsize);


/**
 * @brief md5_s16p   计算给出字符串的MD5值, 并以16进制输出32个字符
 *
 * @param str     字符串
 * @param slen    字符串长度，不包括'\0'
 * @param out     保存MD5值的指针
 * @param outsize out的大小, 不得小于32
 *
 * @return        0: 成功   <0: 失败
 */
int md5_s16p(const char *str, int slen, unsigned char *out, int outsize);


/**
 * @brief md5_f16p   计算给出文件的MD5值, 并以16进制输出32个字符
 *
 * @param str     文件名称
 * @param out     保存MD5值的指针
 * @param outsize out的大小, 不得小于16
 *
 * @return        0: 成功   <0: 失败
 */
int md5_f16p(const char *file, unsigned char *out, int outsize);

#ifdef __cplusplus
}
#endif

#endif
